/***
Copyright (c) 2008-2010 CommonsWare, LLC
portions Copyright (c) 2008-10 Jeffrey Sharkey

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
 */

package org.epidroid.epidroid.androsoul.ui.contactlist;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.BaseAdapter;

/**
 * @author Jeffrey Sharkey Modified by adrien conrath
 * 
 */
abstract public class SectionedAdapter extends BaseAdapter {
	abstract protected View getHeaderView(String caption, int index,
			View convertView, ViewGroup parent);

	private List<Section> sections = new ArrayList<Section>();
	private static int TYPE_SECTION_HEADER = 0;
	private static int TYPE_CONTACT = 1;

	public SectionedAdapter() {
		super();
	}

	public void addSection(String caption, Adapter adapter) {
		sections.add(new Section(caption, adapter));
	}

	/**
	 * @param pos
	 *            Position of the item for which we want to retrieve the
	 *            corresponding section
	 * @return
	 */
	public String getSectionForPos(int pos) {
		for (Section section : this.sections) {
			pos -= 1;
			if (pos < section.adapter.getCount())
				return section.caption;
			pos -= section.adapter.getCount();
		}

		return null;
	}

	public void removeSection(String caption) {
		Iterator<Section> it = sections.iterator();
		while (it.hasNext()) {
			Section s = it.next();
			if (s.toString().equals(caption)) {
				it.remove();
				return;
			}
		}
	}

	public Object getItem(int position) {
		for (Section section : this.sections) {
			if (position == 0) {
				return (section);
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (section.adapter.getItem(position - 1));
			}

			position -= size;
		}

		return (null);
	}

	public int getCount() {
		int total = 0;

		for (Section section : this.sections) {
			total += section.adapter.getCount() + 1; // add one for header
		}

		return (total);
	}

	public int getViewTypeCount() {
		return 2;
	}

	public int getItemViewType(int position) {
		//int typeOffset = TYPE_SECTION_HEADER + 1; // start counting from here

		for (Section section : this.sections) {
			if (position == 0) {
				return (TYPE_SECTION_HEADER);
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (TYPE_CONTACT);
			}

			position -= size;
			//typeOffset += section.adapter.getViewTypeCount();
		}
		return (-1);
	}

	public boolean areAllItemsSelectable() {
		return (false);
	}

	public boolean isEnabled(int position) {
		return true;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		int sectionIndex = 0;

		for (Section section : this.sections) {
			if (position == 0) {
				return (getHeaderView(section.caption, sectionIndex,
						convertView, parent));
			}

			int size = section.adapter.getCount() + 1;

			if (position < size) {
				return (section.adapter.getView(position - 1, convertView,
						parent));
			}

			position -= size;
			sectionIndex++;
		}

		return (null);
	}

	@Override
	public long getItemId(int position) {
		return (position);
	}

	public class Section {
		String caption;
		Adapter adapter;

		Section(String caption, Adapter adapter) {
			this.caption = caption;
			this.adapter = adapter;
		}

		@Override
		public String toString() {
			return caption;
		}
	}

	public void clear() {
		sections.clear();
		notifyDataSetChanged();
	}
}